package com.xingdata.jjxc.map.navi;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Environment;
import android.util.Log;

import com.amap.api.services.core.AMapException;
import com.amap.api.services.help.Inputtips;
import com.amap.api.services.help.Inputtips.InputtipsListener;
import com.amap.api.services.help.Tip;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;
import com.xingdata.jjxc.utils.JsonParser;
import com.xingdata.jjxc.utils.SystemInfo;

/**
 * 
 * 
 * 项目名称：JJXC_VPN 类名称：IATController 类描述： 语音听写组件 创建人：JiangMin 创建时间：2015-6-30
 * 上午11:38:31 修改备注：
 * 
 * @version
 * 
 */
public class IATController {
	private static String TAG = "IATController";
	private Activity mActivity;
	private static IATController iatController;
	// 语音听写对象
	private static SpeechRecognizer mIat;
	// 语音听写UI
	private RecognizerDialog mIatDialog;
	// 引擎类型
	private static String mEngineType = SpeechConstant.TYPE_CLOUD;
	// 用HashMap存储听写结果
	private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
	private RecognizerDialogListener recognizerDialogListener;

	public IATController(Activity activity, RecognizerDialogListener recognizerDialogListener) {
		this.mActivity = activity;
		this.recognizerDialogListener = recognizerDialogListener;
		init();
	}

	public static IATController getInstance(Activity activity, RecognizerDialogListener recognizerDialogListener) {
		if (iatController == null) {
			iatController = new IATController(activity, recognizerDialogListener);
		}
		return iatController;
	}

	public void init() {
		// 初始化识别无UI识别对象
		// 使用SpeechRecognizer对象，可根据回调消息自定义界面；
		mIat = SpeechRecognizer.createRecognizer(mActivity, mInitListener);
		// 初始化听写Dialog，如果只使用有UI听写功能，无需创建SpeechRecognizer
		// 使用UI听写功能，请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
		mIatDialog = new RecognizerDialog(mActivity, mInitListener);
		// 显示听写对话框
		mIatDialog.setListener(recognizerDialogListener);
		setParam();
	}

	/**
	 * 设置基本参数
	 */
	private static void setParam() {

		// 清空参数
		mIat.setParameter(SpeechConstant.PARAMS, null);

		// 设置听写引擎
		mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
		// 设置返回结果格式
		mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

		String lag = "mandarin";
		if (lag.equals("en_us")) {
			// 设置语言
			mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
		} else {
			// 设置语言
			mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
			// 设置语言区域
			mIat.setParameter(SpeechConstant.ACCENT, lag);
		}
		// 设置语音前端点:静音超时时间，即用户多长时间不说话则当做超时处理
		mIat.setParameter(SpeechConstant.VAD_BOS, "4000");

		// 设置语音后端点:后端点静音检测时间，即用户停止说话多长时间内即认为不再输入， 自动停止录音
		mIat.setParameter(SpeechConstant.VAD_EOS, "1000");

		// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
		mIat.setParameter(SpeechConstant.ASR_PTT, "1");

		// 设置音频保存路径，保存音频格式仅为pcm，设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
		mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()
				+ "/iflytek/wavaudio.pcm");

		// 设置听写结果是否结果动态修正，为“1”则在听写过程中动态递增地返回结果，否则只在听写结束之后返回最终结果
		// 注：该参数暂时只对在线听写有效
		mIat.setParameter(SpeechConstant.ASR_DWA, "0");

	}

	/**
	 * 初始化监听器。
	 */
	private InitListener mInitListener = new InitListener() {

		@Override
		public void onInit(int code) {
			Log.d(TAG, "SpeechRecognizer init() code = " + code);
			if (code != ErrorCode.SUCCESS) {
				System.out.println("初始化失败，错误码：" + code);
			}
		}
	};

	public void start() {
		if (!mIatDialog.isShowing()) {
			mIatDialog.show();
		} else {
			mIatDialog.destroy();
		}
	}

	private void printResult(RecognizerResult results) {
		String text = JsonParser.parseIatResult(results.getResultString());
		String sn = null;
		// 读取json结果中的sn字段
		try {
			JSONObject resultJson = new JSONObject(results.getResultString());
			sn = resultJson.optString("sn");
		} catch (JSONException e) {
			e.printStackTrace();
		}
		mIatResults.put(sn, text);
		StringBuffer resultBuffer = new StringBuffer();
		for (String key : mIatResults.keySet()) {
			resultBuffer.append(mIatResults.get(key));
		}

		Inputtips inputtips = new Inputtips(mActivity, new InputtipsListener() {
			@Override
			public void onGetInputtips(List<Tip> list, int arg1) {
				// tips.clear();
				// if (list == null || list.size() == 0) {
				// isSerchSuccess = false;
				// adapter.notifyDataSetChanged();
				// remarkView.setText("您在跟我说悄悄话吗？");
				// } else {
				// remarkView.setText("共搜索到" + list.size() + "个地址");
				// isSerchSuccess = true;
				// tips.addAll(list);
				// adapter.notifyDataSetChanged();
				// }
			}
		});
		try {
			inputtips.requestInputtips(resultBuffer.toString(), SystemInfo.City);
		} catch (AMapException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void onDestory() {
		if (mIat != null) {
			// 退出时释放连接
			mIat.cancel();
			mIat.destroy();
			iatController = null;
		}

		if (mIatDialog != null) {
			mIatDialog.cancel();
			mIatDialog.destroy();
		}
	}
}
